const http = require("http");
const fs = require("fs");
const url = require("url");
const qs = require("querystring");

const serverObj = http.createServer((req, res)=>{
    if(req.url.includes("/api")){
        apiHandel(req, res);
    }else{
        fileHandle(req, res);
    }
})

// 接收get或post数据，数据解析，根据数据决定执行功能
function apiHandel(req, res){
    if(req.method === "GET"){
        // 因为get方式携带的数据在url身上，所以解析url，获取get数据
        const query = url.parse(req.url, true).query;
        routerHandle(req, res, query);
    }else if(req.method === "POST"){
        // 因为post数据在请求对象身上携带，需要通过某些事件获取
        let str = "";
        // data事件：根据数据的大小，可能会被多次触发，每次拿到数据的一部分，利用全局变量，拼接每次拿到的一块数据
        req.on("data", chunk=>{
            str += chunk;
        })
        // end事件：事件本身会在最后一次data事件执行后，被触发，所以在此事件内绝对可以获取到所有data事件中拼接的完整数据，即为post数据
        req.on("end", ()=>{
            const obj = qs.parse(str);
            routerHandle(req, res, obj)
        })
    }
}

// 二级路由设定：以数据中的type字段区分功能
// /api?type=login&username=admin
// /api?type=register&username=admin
// /api?type=getUser&username=admin
// /api?type=getBanner&username=admin
// /api?type=getGoods&username=admin

// 根据数据中携带的功能标志，区分功能
function routerHandle(req, res, reqData){
    switch(reqData.type){
        case "login":
            login(req, res, reqData);break;
        case "register":
            register(req, res, reqData);break;
        // ...
        default:
            error(req, res);
    }
}


function login(req, res, reqData){
    // ...
    res.write("这是登录功能")
    res.end();
}
function register(req, res, reqData){
    // ...
    res.write("这是注册功能")
    res.end();
}

// ...

function error(req, res){
    // ...
    res.write("不合法的功能请求")
    res.end();
}



function fileHandle(req,res){
    const urlObj = url.parse(req.url);
    fs.readFile("./www" + urlObj.pathname, "utf-8", (err, data)=>{
        if(err){
            res.write("NOT FOUND");
            res.end();
        }else{
            res.write(data);
            res.end();
        }
    })
}
serverObj.listen(3000, ()=>{
    console.log("服务器开启成功...")
});
